; ----------------------------------------------------------- ; Programma Antifurto 2 zone 8 ingressi ; di Michele Guerra - mg.temp@tiscali.it ; http://tattik.altervista.org ; ; Versione firmware : 28.04.07 ; Versione hardware : 16.04.07 ; ; Revisioni e note: ; ; . Codice non ottimizzato per occupazione di spazio ; ; ----------------------------------------------------------- ; Direttive di compilazione LIST P=16F628A ; Uso un 16F628A INCLUDE RADIX DEC ; Scrivo in decimale __CONFIG 3F14H ; Locazioni per Variabili RIT1 EQU 40 ; Delay ciclo 1 RIT2 EQU 41 ; Delay ciclo 2 TEMP EQU 42 ; VARIABILE TEMPORANEA W_TMP EQU 43 ; W TEMP X IRQ STS_TMP EQU 44 ; STATUS TEMP X IRQ SENS EQU 45 ; LETTURA SENSORI PARTE EQU 46 ; SEZIONE INTERRUPT DA ESEGUIRE DISP EQU 47 ; DATO DA VISUALIZZARE: XXXX.(L2_RED)(L2_GRN)(L1_RED)(L1_GRN) ; ES. 0000.0110 = VERDE SU LED 2 + ROSSO SU LED 1 PRESS EQU 48 ; CONTROLLA PRESSIONE P1 E P2 ALLARME EQU 49 ; SITUAZIONE DI ALLARME 0=NO, 1-8=NR SENSORE SENS_PREC EQU 50 ; SENSORI LETTURA PRECEDENTE ULT_ACC EQU 51 ; STATO ULTIMA ACCENSIONE: 0=NON ASSEGNATA, 1=NOTTE, 2=GIORNO (NOTTE+IR) PREALL EQU 52 ; SITUAZIONE DI PREALLARME: 0= NESSUNA >0=IN PREALLARME USCITA EQU 53 ; PERIODO DI USCITA SENZA ATTIVAZIONE ALLARME DALLE ZONE PROTETTE BREVE EQU 54 ; RICHIEDE UNA PRESSIONE BREVE DI P1 / P2 ; Equ Varie CICLI EQU 25 ; Cicli per un ritardo di (vd routine RIT) MSEC L1_RED EQU 1 ; BIT SU DISP L1_GRN EQU 0 ; BIT SU DISP L2_RED EQU 3 ; BIT SU DISP L2_GRN EQU 2 ; BIT SU DISP PRESSP1 EQU 1 ; BIT PRESSIONE P1 PRESSP2 EQU 2 ; BIT PRESSIONE P2 NOTTE EQU 0 ; BIT PROTEZIONE NOTTE GIORNO EQU 1 ; BIT PROTEZIONE GIORNO RIT_ACC EQU 4 ; 4*RITX4=4 SECONDI X PREACCENSIONE RIT_USCITA EQU 60 ; 60*RITX4=30 SECONDI X USCITA DALLE ZONE ALLARMATE RIT_PREACC EQU 240 ; 240*RITX4=3 MINUTI PRIMA DI RESETTATE LA SITUAZIONE DI PREALLARME DUR_ALL EQU 240 ; 240*RITX4=3 MINUTI DI SIRENA + RELE' FBREVE EQU 0 ; BIT FLAG SU BREVE ; PORTA "A" K2 EQU 0 ; RA0 = [OUT] K2 : LED ZONA 2 - CATODO K1 EQU 1 ; RA1 = [OUT] K1 : LED ZONA 1 - CATODO SIR_ALL EQU 2 ; RA2 = [OUT] ALL : SIRENA TONO 1 (ALLARME) SIR_BEEP EQU 3 ; RA3 = [OUT] BEEP : SIRENA TONO 2 (ON/OFF/TEST) ALIR EQU 4 ; RA4 = [OUT] ALIR : ALIMENTAZIONE SENSORI INFRAROSSI RA5 EQU 5 ; RA5 = [IN ] -- AV EQU 6 ; RA6 = [OUT] AV : LED COLORE VERDE - ANODO AR EQU 7 ; RA7 = [OUT] AR : LED COLORE ROSSO - ANODO ; PORTA "B" ACIN EQU 0 ; RB0 = [OUT] ACIN : PRESENZA ALIMENTAZIONE 220V CH2 EQU 1 ; RB1 = [IN ] CH1 : CANALE 1 DAL DECODER TELECOMANDO CH1 EQU 2 ; RB2 = [IN ] CH2 : CANALE 2 DAL DECODER TELECOMANDO DIN EQU 3 ; RB3 = [IN ] DIN : DATA IN DAL PISO RB4 EQU 4 ; RB4 = [OUT] -- RELE EQU 5 ; RB5 = [OUT] RELE : RELE AUSILIARIO CKI EQU 6 ; RB6 = [OUT] CKI : CLOCK REGISTRO PISO PS EQU 7 ; RB7 = [OUT] PS : CARICA REGISTRO PISO ; ORG INIZIALIZZAZIONE PROGRAMMA E INTERRUPT ORG 0000H ; VETTORE PROGRAMMA GOTO INIT ORG 0004H ; VETTORE INTERRUPT GOTO INTERR ; INIZIALIZZAZIONE MICRO INIT CLRF TMR0 ; AZZERA SUBITO TMR0 X EVITARE INTERRUPT PRIMA DI ENTRARE IN MAIN BSF STATUS,RP0 ; BANK 1 PER SCRITTURA REGISTRI SPECIALI BCF STATUS,RP1 MOVLW B'00100000' ; RA01234.67 = USCITE, RA5= INGRESSO (LIMITAZIONE HW) MOVWF TRISA MOVLW B'00001111' ; RB0-3 = INGRESSI, RB4-7= USCITE MOVWF TRISB MOVLW B'01011111' ; PULLUB SU PORTB ABILITATI, PRESCALER ASSEGNATO AL WDT=1:128 MOVWF OPTION_REG ; TIMER TMR0 SU BASE CLOCK INTERNO (T0CS=0) MOVLW B'00000011' ; OSCILLATORE INTERNO A 48kHz (00000011) MOVWF PCON ; OSCILLATORE INTERNO A 4MHz (00001011) MOVLW B'10100000' ; IRQ T0IE ABILITATO MOVWF INTCON BCF STATUS,RP0 ; FINE SCRITTURA IN BANK1 MOVLW B'00000111' ; DISABILITA ADC INTERNI MOVWF CMCON ; ED ASSEGNA RA0-2 PIN NORMALI ; INIT VARIABILI VARIE CLRF PORTA ; AZZERAMENTO PORTE CLRF PORTB CLRF DISP ; AZZERAMENTO VARIABILI CLRF ALLARME CLRF ULT_ACC CLRF BREVE MOVLW 1 ; SEZIONE INIZIALE INTERRUPT DA ESEGUIRE=1 MOVWF PARTE ; *** STATO1 = OFF DOPO ACCENSIONE CON O SENZA ALLARME (= STATO INIZIALE) STATO1 BTFSC PORTA,ALIR ; SPEGNE I SENSORI IR "CON DOLCEZZA" :-D BCF PORTA,ALIR CLRF DISP ; AZZERA VARIABILE PER LA VISUALIZZAZIONE MOVF ALLARME,W ; TEMP=ALLARME MOVWF TEMP MOVF TEMP,1 ; SE E' SCATTATO PRECEDENTEMENTE L'ALLARME BTFSC STATUS,Z ; (ALLARME<>0) VISUALIZZA IL NR DEL SENSORE GOTO NOALL ; ALTRIMENTI VISUALIZZA STATO NORMALE DI ATTESA REDOALL BSF DISP,L1_RED ; 1 LAMPEGGIO VELOCE (VALE GIA' COME "SENSORE 1 SCATTATO") BSF DISP,L2_RED ; POI EVENT RIPETUTO ALTRE "ALLARME"-1 VOLTE CALL RIT CLRF DISP ; LED OFF X 1 SECONDO CALL RIT CALL TELETX BTFSC PRESS,PRESSP1 GOTO STATO2 ; E' STATA RICHIESTA L'ACCENSIONE CALL RIT CALL TELETX BTFSC PRESS,PRESSP1 GOTO STATO2 ; E' STATA RICHIESTA L'ACCENSIONE BTFSC PRESS,PRESSP2 GOTO STATO4 ; E' STATO RICHIESTO L'AZZERAMENTO DOPO ALLARME (2 SECONDI DI PRESSIONE) ; (DI CUI 1 GIA' RILEVATO) O IL TEST SENSORI (5 SECONDI DI PRESSIONE). ; LO *STATO4* DISCRIMINA LE SITUAZIONI DECFSZ TEMP,1 ; TEMP-- GOTO REDOALL CALL RITX4 ; 1 SECONDO DOPO FINE LAMPEGGI ; POI SOLITO CICLO STANDBY NOALL CALL TELETX BTFSC PRESS,PRESSP1 GOTO STATO2 ; E' STATA RICHIESTA L'ACCENSIONE CLRF DISP BSF DISP,L1_GRN ; ON L1 GRN BTFSC PRESS,PRESSP2 GOTO STATO4 ; E' STATO RICHIESTO L'AZZERAMENTO DOPO ALLARME (2 SECONDI DI PRESSIONE) ; (DI CUI 1 GIA' RILEVATO) O IL TEST SENSORI (5 SECONDI DI PRESSIONE). ; LO *STATO4* DISCRIMINA LE SITUAZIONI CALL RIT CALL TELETX BTFSC PRESS,PRESSP1 GOTO STATO2 ; E' STATA RICHIESTA L'ACCENSIONE BTFSC PORTB,ACIN ; SE MANCA 220V LAMPEGGIO "ON" + BREVE CLRF DISP CALL RIT CALL TELETX BTFSC PRESS,PRESSP1 GOTO STATO2 ; E' STATA RICHIESTA L'ACCENSIONE CALL RIT CALL TELETX BTFSC PRESS,PRESSP1 GOTO STATO2 ; E' STATA RICHIESTA L'ACCENSIONE CALL RIT CALL TELETX BTFSC PRESS,PRESSP1 GOTO STATO2 ; E' STATA RICHIESTA L'ACCENSIONE CLRF DISP ; 1 SEC OFF CALL RITX4 BTFSS PORTB,ACIN ; SE MANCA 220V FASE "OFF" + LENTA GOTO STATO1 CALL RIT ; + 1 SEC OFF CALL TELETX BTFSC PRESS,PRESSP1 GOTO STATO2 ; E' STATA RICHIESTA L'ACCENSIONE CALL RIT CALL TELETX BTFSC PRESS,PRESSP1 GOTO STATO2 ; E' STATA RICHIESTA L'ACCENSIONE CALL RIT CALL TELETX BTFSC PRESS,PRESSP1 GOTO STATO2 ; E' STATA RICHIESTA L'ACCENSIONE CALL RIT CALL TELETX BTFSC PRESS,PRESSP1 GOTO STATO2 ; E' STATA RICHIESTA L'ACCENSIONE GOTO STATO1 ; *** STATO2 = PREACCENSIONE STATO2 MOVF ULT_ACC,1 ; SE PRIMA ACCENSIONE IN ASSOLUTO BTFSC STATUS,Z ; SETTA COME ULTIMA ACCENSIONE BSF ULT_ACC,NOTTE ; LA MODALITA' "NOTTE" (TUTTI I SENSORI TRANNE GLI IR) CLRF DISP ; VISUALIZZA LA MODALITA' NOTTE/GIORNO ATTUALE BSF DISP,L1_RED ; SENSORI ESTERNI SEMPRE ATTIVI IN ACCENSIONE -> L1_RED BTFSS ULT_ACC,GIORNO ; SE GIORNO -> L2_RED ALTRIMENTI L2_GRN BSF DISP,L2_GRN BTFSC ULT_ACC,GIORNO BSF DISP,L2_RED RE_ACC MOVLW RIT_ACC ; TEMPO DI ATTESA SENZA AZIONI SU PULSANTE P1 MOVWF TEMP ; PRIMA DELL'ACCENSIONE PREACC BSF BREVE,FBREVE ; RICHIEDE UNA PRESSIONE BREVE CALL TELETX ; DALLA RICHIESTA DI ACCENSIONE DALLO STATO1 BCF BREVE,FBREVE ; PRESSIONE NORMALE BTFSC PRESS,PRESSP1 ; L'UTENTE DEVE RILASCIARE P1 PER CAMBIARE MODALITA' GOTO PREACC ; GIORNO/NOTTE O PER ATTIVARE L'ANTIFURTO ; P1 RILASCIATO P1RIL CALL TELETX ; SE PREMUTO X 1 SECONDO CAMBIO MODALITA' BTFSC PRESS,PRESSP1 ; ALTRIMENTI DECREMENTA CONTATORE X ACCENSIONE GOTO CAMBIO_MOD CALL RITX4 ; ASPETTA 1 SECONDO DECFSZ TEMP,1 ; DECREMENTA CONTATORE X ACCENSIONE GOTO P1RIL CALL BEEPX2 ; 2X BEEP LUNGHI X ACCENSIONE CALL RITX4 CALL BEEPX2 CALL RITX4 BTFSC ULT_ACC,GIORNO BSF PORTA,ALIR ; ACCENDE I SENSORI IR SE PROTEZIONE GIORNO GOTO STATO3 ; GESTIONE STATO DI ACCENSIONE CAMBIO_MOD BTFSS ULT_ACC,GIORNO ; CAMBIA NOTTE>GIORNO O GIORNO>NOTTE E RIPETE LA PREACCENSIONE GOTO IMP_GIORNO CLRF ULT_ACC BSF ULT_ACC,NOTTE GOTO STATO2 IMP_GIORNO CLRF ULT_ACC BSF ULT_ACC,GIORNO GOTO STATO2 ; *** STATO3 = ACCESO STATO3 MOVLW RIT_USCITA ; SOLO DOPO CHE RIT_USCITA=0 VENGONO ESEGUITE LE LETTURE SENSORI MOVWF USCITA CLRF PREALL ; AZZERA L'EVENTUALE SITUAZIONE DI PREALLARME CLRF ALLARME ; E L'EVENTUALE ALLARME PRECEDENTE CLRF DISP REDO3 BSF DISP,L1_RED ; VISUALIZZA LA MODALITA' NOTTE/GIORNO SELEZIONATA ; SENSORI ESTERNI SEMPRE ATTIVI IN ACCENSIONE BTFSC ULT_ACC,GIORNO ; L2 VIENE ACCESO SOLO SE MODO "GIORNO" ALTRIMENTI SPENTO (NO GRN) BSF DISP,L2_RED ; I LED RESTANO FISSI PER TUTTO IL RITARDO DI ACCENSIONE CALL TELETX BTFSC PRESS,PRESSP2 ; PRESSIONE P2> SPEGNIMENTO GOTO SPEGNI MOVF USCITA,1 ; -> SE IL CONTATORE DI USCITA NON E' ZERO LO DECREMENTA BTFSC STATUS,Z GOTO LEGGIS ; -> IL TEMPO DI USCITA E' ZERO: LETTURE DEI SENSORI DECF USCITA,1 ; DECREMENTA IL CONTATORE DI USCITA CALL RITX4 ; 1 SECONDO GOTO REDO3 LEGGIS CALL READSENS ; *** PRIMA LETTURA SENSORI (LETTURA DI RIFERIMENTO) MOVF SENS,W ; ANCHE DOPO ALLARME MOVWF SENS_PREC ; CICLO LETTURE DOPO RITARDO DI USCITA REDOSENS MOVF PREALL,1 ; IF PREALL>0 THEN PREALL-- BTFSS STATUS,Z ; DECREMENTA L'EVENTUALE PREALLARME AD OGNI CICLO DECF PREALL,1 CLRF DISP ; VISUALIZZA LA MODALITA' NOTTE/GIORNO SELEZIONATA MOVF ALLARME,W ; TEMP=ALLARME MOVWF TEMP MOVF TEMP,1 ; SE E' SCATTATO PRECEDENTEMENTE L'ALLARME BTFSC STATUS,Z ; (ALLARME<>0) VISUALIZZA IL NR DEL SENSORE GOTO VISACC ; ALTRIMENTI VISUALIZZA STATO NORMALE DI ATTESA VISALL BSF DISP,L1_RED ; 1 LAMPEGGIO (VALE GIA' COME "SENSORE 1 SCATTATO") BSF DISP,L2_RED ; POI EVENT RIPETUTO ALTRE "ALLARME"-1 VOLTE CALL RIT ; LAMPEGGIO VELOCE ON-OFF CLRF DISP CALL TELETX BTFSC PRESS,PRESSP2 ; CONTROLLA SE E' RICHIESTO LO SPEGNIMENTO GOTO SPEGNI CALL READSENS ; *** LETTURA SENSORI (LETTURA OGNI <1 SECONDO) MOVF SENS_PREC,W ; CONTROLLA SE SONO UGUALI SUBWF SENS,W BTFSS STATUS,Z GOTO DIVERSI ; SONO DIVERSI! VA IN ALLARME O PREALLARME CALL RIT CALL READSENS ; *** LETTURA SENSORI (LETTURA OGNI <1 SECONDO) MOVF SENS_PREC,W ; CONTROLLA SE SONO UGUALI SUBWF SENS,W BTFSS STATUS,Z GOTO DIVERSI ; SONO DIVERSI! VA IN ALLARME O PREALLARME CALL RIT CALL READSENS ; *** LETTURA SENSORI (LETTURA OGNI <1 SECONDO) MOVF SENS_PREC,W ; CONTROLLA SE SONO UGUALI SUBWF SENS,W BTFSS STATUS,Z GOTO DIVERSI ; SONO DIVERSI! VA IN ALLARME O PREALLARME CALL TELETX BTFSC PRESS,PRESSP2 ; PRESSIONE P2> SPEGNIMENTO GOTO SPEGNI ; TEMP-- DECFSZ TEMP,1 GOTO VISALL CALL RIT ; 1 SECONDO DOPO FINE LAMPEGGI ; LETTURE INTERMEDIE SENSORI CALL READSENS ; *** LETTURA SENSORI (LETTURA OGNI <1 SECONDO) MOVF SENS_PREC,W ; CONTROLLA SE SONO UGUALI SUBWF SENS,W BTFSS STATUS,Z GOTO DIVERSI ; SONO DIVERSI! VA IN ALLARME O PREALLARME CALL RIT CALL READSENS ; *** LETTURA SENSORI (LETTURA OGNI <1 SECONDO) MOVF SENS_PREC,W ; CONTROLLA SE SONO UGUALI SUBWF SENS,W BTFSS STATUS,Z GOTO DIVERSI ; SONO DIVERSI! VA IN ALLARME O PREALLARME CALL RIT CALL READSENS ; *** LETTURA SENSORI (LETTURA OGNI <1 SECONDO) MOVF SENS_PREC,W ; CONTROLLA SE SONO UGUALI SUBWF SENS,W BTFSS STATUS,Z GOTO DIVERSI ; SONO DIVERSI! VA IN ALLARME O PREALLARME CALL RIT CALL READSENS ; *** LETTURA SENSORI (LETTURA OGNI <1 SECONDO) MOVF SENS_PREC,W ; CONTROLLA SE SONO UGUALI SUBWF SENS,W BTFSS STATUS,Z GOTO DIVERSI ; SONO DIVERSI! VA IN ALLARME O PREALLARME ; POI VISUALIZZAZIONE MODALITA' GIORNO/NOTTE ATTIVA VISACC BSF DISP,L1_RED ; VISUALIZZA LA MODALITA' NOTTE/GIORNO SELEZIONATA ; SENSORI ESTERNI SEMPRE ATTIVI IN ACCENSIONE BTFSC ULT_ACC,GIORNO ; L2 VIENE ACCESO SOLO SE MODO "GIORNO" ALTRIMENTI SPENTO (NO GRN) BSF DISP,L2_RED CALL TELETX BTFSC PRESS,PRESSP2 ; CONTROLLA SE E' RICHIESTO LO SPEGNIMENTO GOTO SPEGNI MOVF PREALL,1 ; VERIFICA IL CONTATORE DI PREALLARME BTFSC STATUS,Z GOTO NOGIALLI ; SE NON E' ZERO I LED DA ROSSI DIVENTANO GIALLI BSF DISP,L1_GRN ; +RED = GIALLO ZONA NOTTE BTFSC ULT_ACC,GIORNO BSF DISP,L2_GRN ; +RED = GIALLO ZONA GIORNO NOGIALLI CALL RIT BTFSC PORTB,ACIN ; SE MANCA 220V LAMPEGGIO "ON" + BREVE CLRF DISP CALL RIT CALL READSENS ; *** LETTURA SENSORI (LETTURA OGNI <1 SECONDO) MOVF SENS_PREC,W ; CONTROLLA SE SONO UGUALI SUBWF SENS,W BTFSS STATUS,Z GOTO DIVERSI ; SONO DIVERSI! VA IN ALLARME O PREALLARME CALL RIT CALL READSENS ; *** LETTURA SENSORI (LETTURA OGNI <1 SECONDO) MOVF SENS_PREC,W ; CONTROLLA SE SONO UGUALI SUBWF SENS,W BTFSS STATUS,Z GOTO DIVERSI ; SONO DIVERSI! VA IN ALLARME O PREALLARME CALL RIT CALL READSENS ; *** LETTURA SENSORI (LETTURA OGNI <1 SECONDO) MOVF SENS_PREC,W ; CONTROLLA SE SONO UGUALI SUBWF SENS,W BTFSS STATUS,Z GOTO DIVERSI ; SONO DIVERSI! VA IN ALLARME O PREALLARME ; 1 SEC OFF CLRF DISP ; 1 SEC OFF CALL RIT CALL READSENS ; *** LETTURA SENSORI (LETTURA OGNI <1 SECONDO) MOVF SENS_PREC,W ; CONTROLLA SE SONO UGUALI SUBWF SENS,W BTFSS STATUS,Z GOTO DIVERSI ; SONO DIVERSI! VA IN ALLARME O PREALLARME CALL RIT CALL READSENS ; *** LETTURA SENSORI (LETTURA OGNI <1 SECONDO) MOVF SENS_PREC,W ; CONTROLLA SE SONO UGUALI SUBWF SENS,W BTFSS STATUS,Z GOTO DIVERSI ; SONO DIVERSI! VA IN ALLARME O PREALLARME CALL RIT CALL READSENS ; *** LETTURA SENSORI (LETTURA OGNI <1 SECONDO) MOVF SENS_PREC,W ; CONTROLLA SE SONO UGUALI SUBWF SENS,W BTFSS STATUS,Z GOTO DIVERSI ; SONO DIVERSI! VA IN ALLARME O PREALLARME CALL RIT CALL READSENS ; *** LETTURA SENSORI (LETTURA OGNI <1 SECONDO) MOVF SENS_PREC,W ; CONTROLLA SE SONO UGUALI SUBWF SENS,W BTFSS STATUS,Z GOTO DIVERSI ; SONO DIVERSI! VA IN ALLARME O PREALLARME ; +1 SEC OFF SE MANCA 220V BTFSC PORTB,ACIN ; SE MANCA 220V FASE "OFF" + LENTA CALL RIT ; + 1 SEC OFF CALL READSENS ; *** LETTURA SENSORI (LETTURA OGNI <1 SECONDO) MOVF SENS_PREC,W ; CONTROLLA SE SONO UGUALI SUBWF SENS,W BTFSS STATUS,Z GOTO DIVERSI ; SONO DIVERSI! VA IN ALLARME O PREALLARME CALL RIT CALL READSENS ; *** LETTURA SENSORI (LETTURA OGNI <1 SECONDO) MOVF SENS_PREC,W ; CONTROLLA SE SONO UGUALI SUBWF SENS,W BTFSS STATUS,Z GOTO DIVERSI ; SONO DIVERSI! VA IN ALLARME O PREALLARME CALL RIT CALL READSENS ; *** LETTURA SENSORI (LETTURA OGNI <1 SECONDO) MOVF SENS_PREC,W ; CONTROLLA SE SONO UGUALI SUBWF SENS,W BTFSS STATUS,Z GOTO DIVERSI ; SONO DIVERSI! VA IN ALLARME O PREALLARME CALL RIT CALL READSENS ; *** LETTURA SENSORI (LETTURA OGNI <1 SECONDO) MOVF SENS_PREC,W ; CONTROLLA SE SONO UGUALI SUBWF SENS,W BTFSC STATUS,Z GOTO REDOSENS ; SONO UGUALI, RIPETI IL CICLO ; LETTURE DIVERSE: CONTROLLO SENSORI ALLARMATI DIVERSI COMF SENS,W ; COMPLEMENTO IL VALORE DELLA LETTURA E XOR CON IL VALORE PRECEDENTE XORWF SENS_PREC,W ; QUINDI I BIT A ZERO SONO QUELLI VARIATI RISPETTO ALLA LETTURA PRECEDENTE MOVWF TEMP ; IN TEMP I BIT A ZERO = INGRESSI VARIATI DALL'ULTIMA LETTURA BTFSS TEMP,0 ; SE I BIT A ZERO SONO RIFERITI AGLI INGRESSI AD ALTA PRIORITA' GOTO SCATTA ; (SENSORI 1-4) L'ALLARME SCATTA SUBITO BTFSS TEMP,1 GOTO SCATTA BTFSS TEMP,2 GOTO SCATTA BTFSS TEMP,3 GOTO SCATTA ; DA QUI I BIT A ZERO SONO ALLORA RIFERITI AGLI INGRESSI CON PREALLARME ; VISTO CHE LE LETTURE ERANO DIVERSE E NON RIGUARDAVANO GLI INGRESSI AD ALTA PRIORITA' MOVF PREALL,1 ; CARICA O VERIFICA IL CONTATORE DI PREALLARME BTFSS STATUS,Z ; SE E' ZERO CARICA IL CONTATORE DI PREALLARME GOTO SCATTA ; SE NON E' ZERO ERAVAMO GIA' IN PREALLARME, QUINDI SCATTA MOVLW RIT_PREACC ; CARICA IL CONTATORE DI PREALLARME MOVWF PREALL GOTO LEGGIS ; RITORNA AL CICLO DI ACCENSIONE SCATTA BTFSS TEMP,0 ; SENSORE IN ALLARME = ULTIMO BIT RILEVATO COME VARIATO (=0) MOVLW 1 BTFSS TEMP,1 MOVLW 2 BTFSS TEMP,2 MOVLW 3 BTFSS TEMP,3 MOVLW 4 BTFSS TEMP,4 MOVLW 5 BTFSS TEMP,5 MOVLW 6 BTFSS TEMP,6 MOVLW 7 BTFSS TEMP,7 MOVLW 8 MOVWF ALLARME ; ALLARME=NUMERO SENSORE SCATTATO CLRF DISP ; IN ALLARME: ROSSO FISSO SUI LED BSF DISP,L1_RED BSF DISP,L2_RED BSF PORTA,SIR_ALL ; ATTIVA LA SIRENA ED IL RELE' BCF PORTA,SIR_BEEP BSF PORTB,RELE MOVLW DUR_ALL ; DURATA ALLARME MOVWF TEMP DECDUR CALL TELETX BTFSC PRESS,PRESSP2 ; CONTROLLA SE E' RICHIESTO LO SPEGNIMENTO GOTO SPEGNI CALL RITX4 ; 1 SECONDO DURATA ALLARME DECFSZ TEMP,1 GOTO DECDUR BCF PORTB,RELE ; DOPO L'ALLARME SPEGNE SIRENA E RELE' BCF PORTA,SIR_ALL CLRF DISP CALL RITX4 ; RITARDO UTILE PER FAR PERCEPIRE CORRETTAMENTE ; IL PRIMO LAMPEGGIO DELLA SEGNALAZIONE DEL NR. DEL SENSORE SCATTATO GOTO LEGGIS ; E TORNA IN ACCENSIONE VISUALIZZANDO SENSORE ALLARMATO SPEGNI BCF PORTB,RELE ; SPEGNE SIRENA E RELE' BCF PORTA,SIR_ALL CLRF DISP ; LED STATO1 BSF DISP,L1_GRN CALL BEEPX4 ; BEEP LUNGO DI SPEGNIMENTO GOTO STATO1 ; RITORNA IN OFF ; *** STATO4 = AZZERAMENTO PRECEDENTE SITUAZIONE DI ALLARME (ED EVENTUALE CONTROLLO SENSORI) STATO4 CALL TELETX BTFSS PRESS,PRESSP2 GOTO STATO1 ; PRESSIONE NON MANTENUTA X 2 SECONDI : TORNA IN STANDBY CLRF ALLARME ; PRESSIONE X 2 SECONDI: AZZERA ALLARME CLRF DISP BSF DISP,L1_GRN ; VISUALIZZA AZZERAMENTO OK CALL BEEPX1 ; BEEP-BEEP X EVIDENZIARE RESET ALLARME CALL RIT CALL BEEPX1 CALL RIT CALL TELETX ; SE PRESSIONE X ALTRI 3 SECONDI ENTRA IN MODALITA' TEST SENSORI BTFSS PRESS,PRESSP2 GOTO STATO1 ; ALTRIMENTI TORNA ALLO STATO 1 ; 3 SECONDI OK CALL TELETX BTFSS PRESS,PRESSP2 GOTO STATO1 ; ALTRIMENTI STATO 1 ; 4 SECONDI OK CALL TELETX BTFSS PRESS,PRESSP2 GOTO STATO1 ; ALTRIMENTI STATO 1 ; 5 SECONDI OK ;GOTO STATO5 ; PASSA IN MODALITA' TEST SENSORI ; *** STATO5 = TEST SENSORI STATO5 BSF PORTA,ALIR ; ACCENDE SENSORI IR CLRF DISP ; L1+L2 VERDI ON BSF DISP,L1_GRN BSF DISP,L2_GRN CALL BEEPX2 ; AVVISA DELL'INGRESSO NEL TEST SENSORI CALL RIT CALL BEEPX2 CALL RIT CALL BEEPX2 CALL RITX4 CALL READSENS ; PRIMA LETTURA SENSORI MOVF SENS,W MOVWF SENS_PREC REDO51 CALL TELETX ; ASPETTA CHE L'UTENTE RILASCI P2 BTFSC PRESS,PRESSP2 GOTO REDO51 REDO5 CALL TELETX ; PREMENDO P2 X 1 SECONDO SI TORNA IN OFF BTFSC PRESS,PRESSP2 GOTO GOST1 CLRF DISP ; LAMPEGGIO VELOCE L1+L2 VERDI BSF DISP,L1_GRN BSF DISP,L2_GRN CALL RIT CLRF DISP CALL RIT CALL READSENS ; LETTURA SENSORI MOVF SENS_PREC,W SUBWF SENS,W BTFSC STATUS,Z ; SE =0 NON è CAMBIATO GOTO REDO5 BSF DISP,L1_RED ; ALTRIMENTI 2X BEEPX1 E LAMPEGGIO L1+L2 RED BSF DISP,L2_RED ; PERCHE' E' STATO RILEVATO IL SENSORE CALL BEEPX1 CLRF DISP CALL RIT BSF DISP,L1_RED BSF DISP,L2_RED CALL BEEPX1 CLRF DISP CALL RIT MOVF SENS,W ; ALLINEA LA PRECEDENTE LETTURA CON QUELLA ATTUALE MOVWF SENS_PREC ; ALTRIMENTI SAREBBE UN BEEP CONTINUO ;) GOTO REDO5 GOST1 CALL BEEPX4 ; BEEP X USCITA DA TEST SENSORI BCF PORTA,ALIR ; SPEGNE SENSORI IR REDO52 CALL TELETX ; ASPETTA CHE L'UTENTE RILASCI P2 BTFSC PRESS,PRESSP2 ; PER EVITARE CICLO CONTINUO DA STATO5 GOTO REDO52 ; A STATO1 GOTO STATO1 ; ------------------------------------------------------------------- ; SUBROUTINE ; ------------------------------------------------------------------- ; "BEEP" DI VARIA DURATA BEEPX1 BCF PORTA,SIR_ALL BSF PORTA,SIR_BEEP B2 CALL RIT ; ~250 MSEC BCF PORTA,SIR_BEEP RETURN BEEPX2 BCF PORTA,SIR_ALL BSF PORTA,SIR_BEEP CALL RIT ; ~500 MSEC GOTO B2 BEEPX4 BCF PORTA,SIR_ALL BSF PORTA,SIR_BEEP CALL RIT ; ~1 SEC CALL RIT GOTO B2 ; CHIAMA RIT 4 VOLTE = ~1 SECONDO RITX4 CALL RIT CALL RIT CALL RIT CALL RIT RETURN ; *** Ritardo = ~ 4+(CICLI*3+4)*CICLI = PERIODI DI CLOCK * 1/(48kHz/4) = ; ; VALORI DI RITARDO CALCOLATI SENZA CONSIDERARE LA DURATA DELLA ROUTINE ; DI INTERRUPT (~30 ISTRUZIONI) ; ; VALORE RITARDO (msec) A 48/4KHZ ; 20 107 ; 31 251 ; 44 499 ; 63 1014 ; ; 255 200 MSES (OSC INT A 4/4MHZ, NO IRQ) ; ; 25 200 MSEC (A 48/4 KHZ, IRQ ON CON TMR0+125) ; RIT CLRWDT ; Azzera WD MOVLW CICLI ; Carica le variabili con i ritardi MOVWF RIT1 MOVWF RIT2 DLY DECFSZ RIT1,1 GOTO DLY ; Primo ciclo di decremento MOVLW CICLI MOVWF RIT1 ; Ricarica DECFSZ RIT2,1 ; Secondo ciclo di decremento GOTO DLY RETURN ; *** CONTROLLA PRESSIONE P1 E P2 PERSISTENTE PER 800 MSEC TELETX CLRF PRESS BTFSC PORTB,CH1 ; P1 PREMUTO > USCITA DA CH1 DI MA4 = 0 GOTO CHK_CH2 CALL RIT ; CTRL PERSISTENZA PRESSIONE CALL RIT BTFSS BREVE,FBREVE ; SE BREVE=1 E' STATA RICHIESTA UNA PRESSIONE BREVE DI P1/P2 CALL RIT ; QUINDI NON ESEGUE "CALL RIT" BTFSC PORTB,CH1 RETURN BSF PRESS,PRESSP2 ; CH1=1 -> PULSANTE2 PREMUTO (!!NUOVI TX= PULSANTI INVERTITI!!) RETURN CHK_CH2 BTFSS PORTB,CH2 ; P2 PREMUTO > USCITA DA CH2 DI MA4 = 1 RETURN CALL RIT ; CTRL PERSISTENZA PRESSIONE CALL RIT BTFSS BREVE,FBREVE ; SE BREVE=1 E' STATA RICHIESTA UNA PRESSIONE BREVE DI P1/P2 CALL RIT ; QUINDI NON ESEGUE "CALL RIT" BTFSS PORTB,CH2 ; P2 PREMUTO RETURN BSF PRESS,PRESSP1 ; PULSANTE1 PREMUTO (!!NUOVI TX= PULSANTI INVERTITI!!) RETURN ; *** LETTURA SENSORI READSENS CLRF SENS ; AZZERA VARIABILE TEMPORANEA SENSORI ; I SENSORI "ALTA PRIORITA'" (0-3) FANNO SCATTARE L'ALLARME ALLA PRIMA VARIAZIONE ; I SENSORI "PREACCENSIONE" (4-7) FANNO SCATTARE L'ALLARME ALLA SECONDA VARIAZIONE BSF PORTB,PS ; CARICA IL REGISTRO PISO NOP ; IMPULSO LARGO NOP BCF PORTB,PS BTFSC PORTB,DIN ; SE OUT PISO = 0 > SENSORE1 = RILEVATO [ALTA PRIORITA'] BSF SENS,0 BSF PORTB,CKI ; SCORRE IL REGISTRO (CLOCK 0>1>0) BCF PORTB,CKI BTFSC PORTB,DIN ; SE OUT PISO = 0 > SENSORE2 = RILEVATO [ALTA PRIORITA'] BSF SENS,1 BSF PORTB,CKI ; SCORRE IL REGISTRO (CLOCK 0>1>0) BCF PORTB,CKI BTFSC PORTB,DIN ; SE OUT PISO = 0 > SENSORE3 = RILEVATO [ALTA PRIORITA'] BSF SENS,2 BSF PORTB,CKI ; SCORRE IL REGISTRO (CLOCK 0>1>0) BCF PORTB,CKI BTFSC PORTB,DIN BSF SENS,3 BSF PORTB,CKI ; SCORRE IL REGISTRO (CLOCK 0>1>0) BCF PORTB,CKI BTFSC PORTB,DIN BSF SENS,4 BSF PORTB,CKI ; SCORRE IL REGISTRO (CLOCK 0>1>0) BCF PORTB,CKI BTFSC PORTB,DIN BSF SENS,5 BSF PORTB,CKI ; SCORRE IL REGISTRO (CLOCK 0>1>0) BCF PORTB,CKI BTFSC PORTB,DIN BSF SENS,6 BSF PORTB,CKI ; SCORRE IL REGISTRO (CLOCK 0>1>0) BCF PORTB,CKI BTFSC PORTB,DIN BSF SENS,7 RETURN ; *** INTERRUPT INTERR CLRWDT MOVWF W_TMP ; PUSH MOVF STATUS,W MOVWF STS_TMP MOVLW 125 ; IN QUESTO MODO LA ROUTINE DI IRQ VIENE MOVWF TMR0 ; CHIAMATA OGNI ~125 ISTRUZIONI, INVECE CHE OGNI ~255 ;-) BCF PORTA,K1 ; K1 cATODO SPENTO BCF PORTA,K2 ; K2 CATODO SPENTO DECFSZ PARTE,1 ; IF PARTE=1 GOTO PT1 ELSE GOTO PT2 GOTO PT2 ; PARTE 1 - ACCENSIONE LED ROSSI PT1 BCF PORTA,AR ; ABILITA IL ROSSO BSF PORTA,AV ; SPEGNE IL VERDE BTFSC DISP,L1_RED BSF PORTA,K1 ; K1 EVENTUALMENTE ON BTFSC DISP,L2_RED BSF PORTA,K2 ; K2 EVENTUALMENTE ON MOVLW 2 ; PROX VOLTA ESEGUE PARTE 2 MOVWF PARTE GOTO EXINT ; PARTE 2 - ACCENSIONE LED VERDI PT2 BCF PORTA,AV ; ABILITA IL VERDE BSF PORTA,AR ; (E SPEGNE IL ROSSO) BTFSC DISP,L1_GRN BSF PORTA,K1 ; K1 EVENTUALMENTE ON BTFSC DISP,L2_GRN BSF PORTA,K2 ; K2 EVENTUALMENTE ON ; QUI PARTE VALE GIA' 1 EXINT MOVF STS_TMP,W ; POP MOVWF STATUS MOVF W_TMP,W BCF INTCON,T0IF ; AZZERA FLAG IRQ RETFIE ; FINE PROGRAMMA END